﻿using System;

namespace DreamCube.Foundation.Basic.Utility
{
    public static class MyNumber
    {
        /// <summary>
        /// Math.Truncate()这个方法是获取浮点数据的整数部分，而此方法是获取小数部分的
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        public static Double TruncateEx(Double d)
        {
            String input = d.ToString();
            return Double.Parse(String.Format("0.{0}", MyString.Right(input, ".")));
        }

        /// <summary>
        /// 四舍五入格式化数字，与Round的区别：
        /// 此方法返回字符串类型（必须是返回字符串类型，如果的double类型的话，则会自动的去掉小数为0的部分的）
        /// 不论指定的数字是否是整数还是小数或者小数部分是0，均保持N为小数点
        /// </summary>
        /// <param name="d">数字</param>
        /// <param name="decimals">小数位数，0表示不保留小数</param>
        /// <param name="integer">整数部分
        /// （控制整数部分的长度，这个非常有意思，默认是-1，整数的长度就是原来的长度，
        /// 当传入大于0的值时，如果整数部分小于这个值时，则不做任何处理，当整数部分的长度
        /// 不足这个值时，则需要在整数前面加0
        /// </param>
        /// <returns></returns>
        public static String Format(Double d, Int32 decimals = 0, Int32 integer = -1)
        {
            Double newD = Math.Round(d, decimals);
            String newDStr = newD.ToString();
           
            //处理小数部分
            if (decimals == 0)
            {
                //去掉小数部分
                newDStr = MyString.LeftOfLast(newDStr, ".", false, newDStr);
            }
            else
            {
                //获取到小数的部分
                String xs = MyString.RightOfLast(newDStr, ".");
                if (xs.Length != decimals)
                {
                    //在小数后面补上0
                    if (xs.Length == 0) newDStr += ".";
                    for (Int32 i = 0; i < decimals - xs.Length; i++)
                        newDStr += "0";
                }
            }

            //处理整数部分
            if (integer > 0)
            {
                //获取到整数的部分
                String zs = MyString.LeftOfLast(newDStr, ".", false, newDStr);
                if (zs.Length < integer)
                {
                    for (Int32 i = 0; i < integer - zs.Length; i++)
                        newDStr = "0" + newDStr;
                }
            }
            return newDStr;
        }
    }
}
